#ifndef K_MEANS_H
#define K_MEANS_H

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// structure contenant les centres mobiles
typedef struct {
	int dimensionDesDonnees;
	int nombreDeCentre;
	//coordonnees des centres mobiles plus une case en plus
	//la première contient le nombre de points appartenants à la classe
	double** codeBook;
} Map;
// structure contenant les donnees
typedef struct {
	int dimensionDesDonnees;
	int nombreDesDonnees;
	double** data;
} Data;

/*matrice de covariance qui contient les covariances entres les coordonnées de chaque point
 * c'est un tableau de 3 dimensions la matrice de covariance est un tableau de 2 dimensions
 * et la troisième dimension reflète le nombre de centres*/
double*** covariances;

int minimumDistance(double*, int);

/* permettant d’initialiser et d’allouer dynamiquement l’espace memoire
 *  necessaire a une strcuture Map contenant les centres mobiles*/
/*J'ai changé la signature de la fonction puisque
 * j'utilise des variables globales initialisé depuis le main.
 *  c'est à l'utilisateur d'entrer le nombre de centre sinon il sera initialisé à 2*/
Map* initialiserLesCentresMobiles(Data* myData);

/* calcule les distances entre un point et tout les centres,
 * elle rend l'indice du centre le plus proche*/
int nearestCenter(double*, Map*);

/*mise en œuvre à proprement parler de l’algorithme permettant de calculer
 * les centres mobiles a partir des donnees */
Map* apprendreLesCentresMobiles(Map*, Data*);

/* attribue à chaque donnée le centre (la classe) lui correspondant
 * (bmus pour Best Matching Unit)*/
void attribuerLesDonneesAuxCentresMobiles(Map*, Data*);

/*pour chaque classe, calcule le centre de classe (centre mobile) correspondant
 * et met la structure carte à jour*/
Map * calculerLesCentresDeClasses(Map*, Data*, int*);
/*fonction utilitaire permettant de creer une structure de centre vide */
Map* createStructureOfCentres(int);
void calculateCovariances(Map*, Data*) ;
/*fontion permettant de savoir si le programme converge ou non */
int convergenceDetecte(int, Map*, Map*);
void generateGnuPLotData(Map*, Data*) ;
#endif
